﻿/*****************************************************
**Copyright(C), 2021-2022, Ciqtek Technology.
**Version:     1.0
**Author:      dingyy
**Date:        2022/04/18
**Description: 高精度定时器--线程实现,建议在时间间隔小于100ms下使用，否则线程退出很慢
*****************************************************/

#ifndef PRECISETIMER_H
#define PRECISETIMER_H

#include "common_global.h"

#include <QObject>
#include <thread>
#include <mutex>
#include <atomic>

namespace Common {

	class COMMONSHARED_EXPORT PreciseTimer :public QObject
	{
		Q_OBJECT

	public:
		/**
		 * @brief  PreciseTimer 构造函数
		 * @return
		 */
		PreciseTimer();

		/**
		 * @brief  ~PreciseTimer 析构函数
		 * @return
		 */
		~PreciseTimer();

	public:
		/**
		 * @brief  start 启动定时器
		 * @param  msec 建议在时间间隔小于100ms下使用，否则线程退出很慢
		 * @return void
		 */
		void start(int msec);

		/**
		 * @brief  stop 停止定时器
		 * @return void
		 */
		void stop();

	Q_SIGNALS:
		/**
		 * @brief  signalTimeout 超时信号
		 * @return void
		 */
		void signalTimeout();

	private:
		/**
		 * @brief  threadFunc 线程函数
		 * @param  arg
		 * @return void
		 */
		static void threadFunc(void *arg);

	private:
		/** 线程
		 */
		std::thread *m_thread;

		/** 是否退出线程
		 */
		std::atomic<bool> m_isExit;

		/** 等待时间
		 */
		std::atomic<int> m_sleepTime;
	};

}

#endif // PRECISETIMER_H